个人博客

学习加油站


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

「ES6学习」解构赋值(二)

发表于 2019-09-16

「ES6学习」解构赋值(二)

注:本文参考文章 阮一峰 ECMAScript 6 入门

引言

按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构

解构赋值语法是一种 JavaScript 表达式。通过解构赋值, 可以将属性/值从对象/数组中取出,赋值给其他变量。

变量的解构赋值主要有:

  • 数组的解构赋值
  • 对象的解构赋值
  • 字符串的解构赋值
  • 数值和布尔值的解构赋值
  • 函数参数的解构赋值

对象的解构赋值

对象的解构与数组的重要不同之处
  • 数组的元素按次序排列,变量的取值由它的位置决定;
  • 对象的元素/属性没有次序,变量必须与属性同名,才能取到正确的值。

    1
    2
    3
    4
    5
    6
    let { a, b } = { b:'bb', a:'aa'};
    // a="aa"; b="bb"
    // 次序不一致,对取值没有影响
    let { test } = { Test: 'aa', text:'bb'};
    // test=undefined
    // 没有对应的同名属性:解构失败,变量的值等于undefined
可以将现有对象的方法,赋值到某个变量
1
2
3
4
5
// Math 对象
let { log, sin, cos } = Math;
// console 对象
const { log } = console;
log('hello') // hello
如果变量名与属性名不一致,必须写成下面这样
1
2
let { first: f, last: l } = { first: 'hello', last: 'world' };
//f='hello'; l='world'
对象的解构赋值的内部机制
  • 先找到同名属性,然后再赋给对应的变量

  • 真正被赋值的是后者,而不是前者

1
2
3
4
let { first: one } = { first: '1', second: '2' };

one // "1"
first // Uncaught ReferenceError: first is not defined

first是匹配的模式,one才是变量。真正被赋值的是变量one,而不是模式first。

嵌套结构的对象
1
2
3
4
5
6
7
8
9
10
11
12
13
const obj = {
loc: {
start: {
line: 1,
column: 5
}
}
};

let { loc, loc: { start }, loc: { start: { line }} } = obj;
line // 1
loc // Object {start: Object}
start // Object {line: 1, column: 5}

三次解构赋值,分别是对loc、start、line三个属性的解构赋值。

注意: 最后一次对line属性的解构赋值之中,只有line是变量,loc和start都是模式,不是变量。

默认值

默认值生效的条件是,对象的属性值严格等于undefined

1
2
3
4
5
var {x = 1} = {x: undefined};
x // 1

var {x = 1} = {x: null};
x // null

上面代码中,属性x等于null,因为null与undefined不严格相等,所以是个有效的赋值,导致默认值1不会生效。

注意点:
1. 将一个已经声明的变量用于解构赋值
1
2
3
4
5
6
7
// 错误的写法
let x;
{x} = {x: 1}; // SyntaxError: syntax error

// 正确的写法
let x;
({x} = {x: 1}); // 将整个解构赋值语句,放在一个圆括号里面,就可以正确执行

JavaScript 引擎会将{x}理解成一个代码块,从而发生语法错误。

只有不将大括号写在行首,避免 JavaScript 将其解释为代码块,才能解决这个问题。

2. 解构赋值允许等号左边的模式之中,不放置任何变量名。
1
2
3
({} = [true, false]);
({} = 'abc');
({} = []);
3. 由于数组本质是 特殊的对象 ,因此可以对数组进行对象属性的解构
1
2
3
4
let arr = [1, 2, 3];
let {0 : first, [arr.length - 1] : last} = arr;
first // 1
last // 3

字符串的解构赋值

字符串的解构赋值 —— 字符串被转换成了一个 类似数组的对象。
1
2
3
4
5
6
const [a, b, c, d, e] = 'hello';
a // "h"
b // "e"
c // "l"
d // "l"
e // "o"
类似数组的对象都有一个length属性
1
2
let {length : len} = 'hello';
len // 5
# JS # ES6
「ES6学习」解构赋值(一)
JavaScript 数组去重(一)
  • 文章目录
  • 站点概览

WYP

知识管理,自我管理
12 日志
8 标签
GitHub E-Mail 简书
  1. 1. 「ES6学习」解构赋值(二)
    1. 1.1. 引言
    2. 1.2. 对象的解构赋值
      1. 1.2.0.1. 对象的解构与数组的重要不同之处
        1. 1.2.0.1.1. 可以将现有对象的方法,赋值到某个变量
        2. 1.2.0.1.2. 如果变量名与属性名不一致,必须写成下面这样
      2. 1.2.0.2. 对象的解构赋值的内部机制
      3. 1.2.0.3. 嵌套结构的对象
      4. 1.2.0.4. 默认值
      5. 1.2.0.5. 注意点:
        1. 1.2.0.5.1. 1. 将一个已经声明的变量用于解构赋值
        2. 1.2.0.5.2. 2. 解构赋值允许等号左边的模式之中,不放置任何变量名。
        3. 1.2.0.5.3. 3. 由于数组本质是 特殊的对象 ,因此可以对数组进行对象属性的解构
  2. 1.3. 字符串的解构赋值
    1. 1.3.0.1. 字符串的解构赋值 —— 字符串被转换成了一个 类似数组的对象。
    2. 1.3.0.2. 类似数组的对象都有一个length属性
© 2019 – 2021 wyp